
package appvideo.persistencia;


import appvideo.logica.Pelicula;
import appvideo.logica.Producto;
import appvideo.logica.Proveedor;
import appvideo.logica.Tarifa;
import appvideo.logica.Videojuego;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class Persistencia_Productos {
    
    
    //Metodo que muestra todas las peliculas
    public static List<Producto> getProductos(Producto producto){
        List<Producto> productos=new ArrayList();
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        try {
            st = con.createStatement();
            if(producto instanceof Pelicula){
                rs = st.executeQuery("Select peliculas.id,peliculas.codigo ,peliculas.nombre, id_prov, fCompra, peliculas.id_tarifa, genero, formato, duracion,peliculas.estado, "
                        + "tarifas.nombre, tarifas.precio, tarifas.id, "
                        + "proveedores.id, proveedores.nombre,proveedores.fAlta, proveedores.telefono, proveedores.email, proveedores.direccion "
                        + "FROM peliculas "
                        + "LEFT JOIN tarifas ON peliculas.id_tarifa = tarifas.id "
                        + "LEFT JOIN proveedores ON peliculas.id_prov = proveedores.id "
                        + "WHERE peliculas.estado=1");

                while(rs.next()){
                    Proveedor proveedor = new Proveedor(rs.getInt("proveedores.id"), rs.getString("proveedores.nombre"),rs.getString("proveedores.email"),rs.getString("proveedores.direccion"),rs.getInt("proveedores.telefono"),rs.getDate("proveedores.fAlta"));
                    Tarifa t = new Tarifa(rs.getString("tarifas.nombre"),rs.getDouble("tarifas.precio"),rs.getInt("tarifas.id"));
                    Producto p = new Pelicula(rs.getInt("codigo"),rs.getString("peliculas.nombre"),proveedor,rs.getDate("fCompra"),t,rs.getString("genero"),rs.getString("formato"),rs.getInt("duracion"));
                    productos.add(p);
                }
            }
            if(producto instanceof Videojuego){
                rs = st.executeQuery("Select videojuegos.codigo ,videojuegos.nombre, id_prov, fCompra, videojuegos.id_tarifa, videojuegos.genero, plataforma,videojuegos.estado, "
                        + "tarifas.nombre, tarifas.precio, tarifas.id, "
                        + "proveedores.id, proveedores.nombre,proveedores.fAlta, proveedores.telefono, proveedores.email, proveedores.direccion "
                        + "FROM videojuegos "
                        + "LEFT JOIN tarifas ON videojuegos.id_tarifa = tarifas.id "
                        + "LEFT JOIN proveedores ON videojuegos.id_prov = proveedores.id "
                        + "WHERE videojuegos.estado =1");
                

                while(rs.next()){
                    Proveedor proveedor = new Proveedor(rs.getInt("proveedores.id"), rs.getString("proveedores.nombre"),rs.getString("proveedores.email"),rs.getString("proveedores.direccion"),rs.getInt("proveedores.telefono"),rs.getDate("proveedores.fAlta"));
                    Tarifa t = new Tarifa(rs.getString("tarifas.nombre"),rs.getDouble("tarifas.precio"),rs.getInt("tarifas.id"));
                    Producto p = new Videojuego(rs.getInt("codigo"),rs.getString("videojuegos.nombre"),proveedor,rs.getDate("fCompra"),t,rs.getString("genero"),rs.getString("Plataforma"));
                    productos.add(p);
                }
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }  catch(Exception e){
                System.out.println(e.getMessage());
            } 
        }        
        return productos;
    }
   
    public static void insertaProducto(Producto producto){
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        try {
            st = con.createStatement();
            //inserta pelicula
            int estado=1;
            if(producto instanceof Pelicula){
                Pelicula p = (Pelicula) producto;//casteo
                    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                    st.executeUpdate("INSERT INTO peliculas (codigo,nombre,id_prov,fCompra,id_tarifa,genero,formato,duracion,estado)"
                            + "VALUES ("+p.getCodigo()+",'"+p.getNombre()+"',"+p.getProveedor().getId()+",'"+dt.format(p.getFechacompra())+"',"+p.getTarifa().getId()+",'"+p.getGenero()+"','"+p.getFormato()+"',"+p.getDuracion()+","+estado+")");
            }            
            //inserta videojuego
            if(producto instanceof Videojuego){
                Videojuego j = (Videojuego) producto;//casteo
                SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                String query = "INSERT INTO videojuegos (codigo,nombre,id_prov,fCompra,id_tarifa,genero,plataforma,estado)"
                            + "VALUES ("+j.getCodigo()+",'"+j.getNombre()+"',"+j.getProveedor().getId()+",'"+dt.format(j.getFechacompra())+"',"+j.getTarifa().getId()+",'"+j.getGenero()+"','"+j.getPlataforma()+"',"+estado+")";
                st.executeUpdate(query);                
            }                        
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            try {                
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }  catch(Exception e){
                System.out.println(e.getMessage());
            } 
        }                
    }
    
    public static Producto buscaProducto(Producto producto, int codigo){        
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        Producto p = null;
        try {
            st = con.createStatement();
            //En esta consulta cojo los datos de la pelicula y con su idtarifa cono los datos de la tarifa
            if(producto instanceof Pelicula){
                rs = st.executeQuery("Select peliculas.id,peliculas.codigo ,peliculas.nombre, id_prov, fCompra, peliculas.id_tarifa, genero, formato, duracion,peliculas.estado, "
                        + "tarifas.nombre, tarifas.precio, tarifas.id, "
                        + "proveedores.id, proveedores.nombre,proveedores.fAlta, proveedores.telefono, proveedores.email, proveedores.direccion "
                        + "FROM peliculas "
                        + "LEFT JOIN tarifas ON peliculas.id_tarifa = tarifas.id "
                        + " LEFT JOIN proveedores ON peliculas.id_prov = proveedores.id "
                        + "WHERE peliculas.estado=1 AND peliculas.codigo = '"+codigo+"'");
                if(rs.next()){//para que se situe en el objeto deseado
                    //creo tarifa
                    Proveedor proveedor = new Proveedor(rs.getInt("proveedores.id"), rs.getString("proveedores.nombre"),rs.getString("proveedores.email"),rs.getString("proveedores.direccion"),rs.getInt("proveedores.telefono"),rs.getDate("proveedores.fAlta"));
                    Tarifa t = new Tarifa(rs.getString("tarifas.nombre"),rs.getDouble("tarifas.precio"),rs.getInt("tarifas.id"));
                    //creo pelicula
                    p = new Pelicula(rs.getInt("peliculas.id"),rs.getInt("codigo"),rs.getString("peliculas.nombre"),proveedor,rs.getDate("fCompra"),t,rs.getString("genero"),rs.getString("formato"),rs.getInt("duracion"));                       
                }
            }
            else{
                rs = st.executeQuery("Select videojuegos.id, videojuegos.codigo ,videojuegos.nombre, id_prov, fCompra, videojuegos.id_tarifa, videojuegos.genero, plataforma,videojuegos.estado, "
                        + "tarifas.nombre, tarifas.precio, tarifas.id, "
                        + "proveedores.id, proveedores.nombre,proveedores.fAlta, proveedores.telefono, proveedores.email, proveedores.direccion"
                        + " FROM videojuegos "
                        + " LEFT JOIN tarifas ON videojuegos.id_tarifa = tarifas.id"
                        + " LEFT JOIN proveedores ON videojuegos.id_prov = proveedores.id"
                        + " WHERE videojuegos.estado=1 AND videojuegos.codigo = '"+codigo+"'");
                if(rs.next()){
                    //creo tarifa
                    Proveedor proveedor = new Proveedor(rs.getInt("proveedores.id"), rs.getString("proveedores.nombre"),rs.getString("proveedores.email"),rs.getString("proveedores.direccion"),rs.getInt("proveedores.telefono"),rs.getDate("proveedores.fAlta"));
                    Tarifa t = new Tarifa(rs.getString("tarifas.nombre"),rs.getDouble("tarifas.precio"),rs.getInt("tarifas.id"));
                    //creo pelicula
                    p = new Videojuego(rs.getInt("videojuegos.id"),rs.getInt("codigo"),rs.getString("videojuegos.nombre"),proveedor,rs.getDate("fCompra"),t,rs.getString("genero"),rs.getString("plataforma"));                       
                }
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }  catch(Exception e){
                System.out.println(e.getMessage());
            } 
        }
        return p;
        
    }
    
    public static void modificaProducto(Producto producto){        
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        try {
            st = con.createStatement();
            //Esta consulta coge todos los datos necesarios para crear el empleado y su salario de la base de datos
            if(producto instanceof Pelicula){
                Pelicula p = (Pelicula) producto;//casteo
                SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                st.executeUpdate("UPDATE peliculas SET "
                        + "nombre ='"+p.getNombre()+"',id_prov ="+p.getProveedor().getId()+",id_tarifa="+p.getTarifa().getId()+",genero='"+p.getGenero()+"',formato='"+p.getFormato()+"',duracion="+p.getDuracion()+" WHERE id = "+p.getId()+"");                        
            }
            else{
                Videojuego j = (Videojuego) producto;//casteo
                SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                st.executeUpdate("UPDATE videojuegos SET "
                        + "nombre ='"+j.getNombre()+"',id_prov ="+j.getProveedor().getId()+",id_tarifa="+j.getTarifa().getId()+",genero='"+j.getGenero()+"',plataforma='"+j.getPlataforma()+"' WHERE id = "+j.getId()+"");                        
            
            }
            } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            try {                
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }  catch(Exception e){
                System.out.println(e.getMessage());
            } 
        }        
    }
    
    public static void borraProducto(Producto p){
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        try {
            st = con.createStatement();
            //Esta consulta coge todos los datos necesarios para crear el empleado y su salario de la base de datos
            SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
            if(p instanceof Pelicula){
                st.executeUpdate("UPDATE peliculas SET "
                        + "estado ="+2+" "
                        + "WHERE id = "+p.getId()+""); 
            }
            if(p instanceof Videojuego){
                st.executeUpdate("UPDATE videojuegos SET "
                        + "estado ="+2+" "
                        + "WHERE id = "+p.getId()+""); 
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            try {
                
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }  catch(Exception e){
                System.out.println(e.getMessage());
            } 
        }              
    }
    
    public static boolean compruebaCodigo(Producto producto, int codigo){
        
        boolean a = true;
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        Producto p = null;
        try {
            st = con.createStatement();
            //En esta consulta cojo los datos de la pelicula y con su idtarifa cono los datos de la tarifa
            if(producto instanceof Pelicula){
                rs = st.executeQuery("select count(0) as contador from peliculas where codigo = '"+codigo+"'");
                rs.first();//para que se situe en el objeto deseado
                
                if(rs.getInt("contador")>0){
                    a=false;
                }
                
            }
            else{
                rs = st.executeQuery("select count(0) as contador from videojuegos where codigo = '"+codigo+"'");
                rs.first();//para que se situe en el objeto deseado
                
                if(rs.getInt("contador")>0){
                    a=false;
                }
            
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        } catch(Exception e){
            System.out.println(e.getMessage());
        }
        finally{
            try {
                rs.close();
                st.close();
                con.close();
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }  catch(Exception e){
                System.out.println(e.getMessage());
            } 
        }
        
        return a;
        
    }
  
}
